"""
数据库模块 - 基础 ORM 模型 (BaseModel)

提供一个包含通用字段的 SQLAlchemy 声明性基类。
所有实体 ORM 模型都应该继承此类，以获得统一的公共字段。
"""
from datetime import datetime

from sqlalchemy import BigInteger, DateTime, func
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column

from axiom_boot.core.types import BigInt


class BaseModel(DeclarativeBase):
    """
    一个异步的、通用的数据映射器基类，封装了丰富的 CRUD 功能。

    它定义了所有模型都应包含的通用字段，如主键 ID、创建/更新时间戳和软删除标记。
    字段的默认值和更新逻辑由 BaseMapper 在数据操作时统一处理。
    """
    __abstract__ = True

    id: Mapped[BigInt] = mapped_column(BigInteger, primary_key=True, comment="主键ID")
    
    create_time: Mapped[datetime] = mapped_column(
        DateTime,
        nullable=False,
        server_default=func.now(),
        comment="创建时间"
    )

    update_time: Mapped[datetime] = mapped_column(
        DateTime,
        nullable=False,
        server_default=func.now(),
        onupdate=func.now(),
        comment="更新时间"
    )

    is_deleted: Mapped[int] = mapped_column(
        default=0,
        nullable=False,
        comment="是否删除 (0-未删除, 1-已删除)"
    )

    def to_dict(self) -> dict:
        """将模型实例转换为字典，不包括 SQLAlchemy 的内部状态。"""
        return {
            c.name: getattr(self, c.name)
            for c in self.__table__.columns
        }

    def to_json_dict(self) -> dict:
        """
        将模型实例转换为一个 JSON 兼容的字典。
        它会在 to_dict() 的基础上，处理 datetime 等特殊类型。
        """
        d = self.to_dict()
        for key, value in d.items():
            if isinstance(value, datetime):
                d[key] = value.isoformat()
        return d 